package logic

import (
	"archive/zip"
	"io"
	"os"
	"path/filepath"
	"strings"
)

// 压缩文件
func ZipDirectory(source, target string) error {
	// 创建一个新的zip文件
	zipfile, err := os.Create(target)
	if err != nil {
		return err
	}
	defer zipfile.Close()

	// 创建一个zip写入器
	archive := zip.NewWriter(zipfile)
	defer archive.Close()

	// 遍历源目录
	filepath.Walk(source, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return err
		}
		// （兼容 Linux）
		path = strings.ReplaceAll(path, string(os.PathSeparator), "/")

		// 创建一个新的文件头
		header, err := zip.FileInfoHeader(info)
		if err != nil {
			return err
		}

		// 处理文件路径
		header.Name, err = filepath.Rel(filepath.Dir(source), path)
		// 转换为相对路径（兼容 Linux）
		header.Name = strings.ReplaceAll(header.Name, string(os.PathSeparator), "/")

		if err != nil {
			return err
		}
		if info.IsDir() {
			header.Name += "/"
		} else {
			// 设置压缩方法
			header.Method = zip.Deflate
		}

		// 创建一个新的文件写入器
		writer, err := archive.CreateHeader(header)
		if err != nil {
			return err
		}

		// 如果是文件，将文件内容写入zip文件
		if !info.IsDir() {
			file, err := os.Open(path)
			if err != nil {
				return err
			}
			defer file.Close()
			_, err = io.Copy(writer, file)
			if err != nil {
				return err
			}
		}
		return nil
	})

	return nil
}
